/**
 * dateUtils.js
 * * 统一处理日期解析、格式化和计算的工具模块。
 */

/**
 * 解析各种格式的日期输入，并返回一个标准的 Date 对象。
 * 这是进行日期比较和计算的基础。
 * @param {string | number | Date} dateInput - 可能是日期字符串, 13位时间戳, 或 Date 对象
 * @returns {Date | null} 如果输入有效则返回 Date 对象, 否则返回 null
 */
export const parseDate = (dateInput) => {
    if (!dateInput) return null;
    
    try {
        let date;

        // 如果已经是Date对象, 直接返回副本
        if (dateInput instanceof Date) {
            date = new Date(dateInput);
        }
        // 如果是13位时间戳
        else if (!isNaN(dateInput) && String(dateInput).length === 13) {
            date = new Date(parseInt(dateInput, 10));
        }
        // 如果是日期字符串
        else if (typeof dateInput === 'string') {
            // 替换常见中文和分隔符以提高兼容性
            const cleanedStr = dateInput.replace(/[年月日]/g, '-').replace(/\//g, '-').replace(/\./g, '-').replace(/-$/, '');
            date = new Date(cleanedStr);
        }
        else {
            return null; // 无法识别的类型
        }
        
        // 检查生成的日期是否有效 (e.g., new Date('2023-02-30') 会产生无效日期)
        if (isNaN(date.getTime())) {
            return null;
        }

        return date;
    } catch (error) {
        console.warn('日期解析错误:', error, '原始值:', dateInput);
        return null;
    }
};


/**
 * 格式化日期输入为指定格式的字符串。
 * (这是您提供的函数，非常棒！)
 * @param {string | number | Date} dateStr - 可能是日期字符串, 13位时间戳, 或 Date 对象
 * @param {string} format - 目标格式
 * @returns {string | null} 格式化后的日期字符串, 或在无法解析时返回 null
 */
export const formatDate = (dateStr, format = 'YYYY-MM-DD') => {
    const date = parseDate(dateStr); // 复用 parseDate 逻辑
    if (!date) {
        // 如果无法解析，可以返回一个默认值或原值
        return dateStr ? String(dateStr) : null;
    }

    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');

    switch (format) {
        case 'YYYY-MM':
            return `${year}-${month}`;
        case 'YYYY-MM-DD':
            return `${year}-${month}-${day}`;
        case 'YYYY年MM月':
            return `${year}年${month}月`;
        case 'YYYY年MM月DD日':
            return `${year}年${month}月${day}日`;
        default:
            return `${year}-${month}-${day}`;
    }
};


/**
 * 给日期增加指定天数
 * @param {Date} date - 初始日期
 * @param {number} days - 增加的天数
 * @returns {Date} - 计算后的新 Date 对象
 */
export const addDays = (date, days) => {
    const newDate = new Date(date);
    newDate.setDate(newDate.getDate() + days);
    return newDate;
};

/**
 * 给日期增加指定月数
 * @param {Date} date - 初始日期
 * @param {number} months - 增加的月数
 * @returns {Date} - 计算后的新 Date 对象
 */
export const addMonths = (date, months) => {
    const newDate = new Date(date);
    newDate.setMonth(newDate.getMonth() + months);
    return newDate;
};
    
/**
 * 计算两个日期之间的绝对天数差
 * @param {Date} d1 
 * @param {Date} d2 
 * @returns {number}
 */
export const daysBetween = (d1, d2) => {
    const oneDay = 24 * 60 * 60 * 1000;
    // 忽略时区和夏令时差异，仅基于UTC日期进行计算
    const utc1 = Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate());
    const utc2 = Date.UTC(d2.getFullYear(), d2.getMonth(), d2.getDate());
    return Math.floor(Math.abs((utc1 - utc2) / oneDay));
};